package com.towerdefence.towers {

import com.etc.towers.Tower_mc;

import flash.display.Sprite;
import flash.display.MovieClip;

import com.framework.math.*;
import com.towerdefence.Universe;
import com.towerdefence.enemies.*;
import com.towerdefence.interfaces.IGameObject;

public class TowerBase extends Sprite implements IGameObject {

	//---------------------------------------
	// CLASS CONSTANTS
	//---------------------------------------
	public static const STATE_IDLE:uint = 1;
	public static const STATE_ATTACK:uint = 2;

	//---------------------------------------
	// PRIVATE VARIABLES
	//---------------------------------------
	protected var _universe:Universe = Universe.getInstance(); // Ссылка на игровой мир

	private var _towerName: String;
	private var _sprite:Tower_mc;

//		protected var _body:MovieClip; // Графическое тело башни
//		protected var _head:MovieClip; // Графическая пушка башни

	protected var _tilePos:Avector = new Avector(); // Позиция башни в тайлах
	protected var _state:uint = STATE_IDLE; // Текущее состояние башни
	protected var _idleDelay:int = 0; // Интервал для задержки между проверками на приближение врагов

	private var _attackRadius:Number = 100; // Радиус атаки башни
	private var _attackInterval:Number = 8; // В кадрах (?)
	private var _attackDamage:Number = 0.2; // Наносимый урон одним выстрелом
	private var _bulletSpeed:Number = 100; // Скорость пули
	protected var _enemyTarget:EnemyBase; // Ссылка на атакуемого юнита
	protected var _isFree:Boolean = true;

	//---------------------------------------
	// CONSTRUCTOR
	//---------------------------------------

	/**
	 * @constructor
	 */
	public function TowerBase() {
		// nothing
	}

	/**
	 * @destructor
	 */
	public function free():void {
		// Удаляем тело
		if (_sprite && contains(_sprite)) {
			removeChild(_sprite);
		}

		// Удаляем башню из игры
		_universe.removeChild(this);
		_universe.towers.remove(this);
	}

	//---------------------------------------
	// PUBLIC METHODS
	//---------------------------------------

	/**
	 * Инициализация башни перед её использованием.
	 */
	public function init(tileX:int, tileY:int):void {
		if (_sprite != null) {
			addChild(_sprite);
		}

		_isFree = false;

		// Запоминаем положение в тайлах
		_tilePos.set(tileX, tileY);

		// Устанавливаем графический образ башни
		x = Universe.toPix(tileX);
		y = Universe.toPix(tileY);

		// Добавляем башню в игру
		_universe.towers.add(this);
		_universe.addChild(this);
	}

	/**
	 * Общий метод в котором производятся расчеты для всех башен.
	 */
	public function update(delta:Number):void {

	}

	public function get attackRadius():Number {
		return _attackRadius;
	}

	public function set attackRadius(value:Number):void {
		_attackRadius = value;
	}

	public function get attackInterval():Number {
		return _attackInterval;
	}

	public function set attackInterval(value:Number):void {
		_attackInterval = value;
	}

	public function get attackDamage():Number {
		return _attackDamage;
	}

	public function set attackDamage(value:Number):void {
		_attackDamage = value;
	}

	public function get sprite():Tower_mc {
		return _sprite;
	}

	public function set sprite(value:Tower_mc):void {
		_sprite = value;
	}

	public function get bulletSpeed():Number {
		return _bulletSpeed;
	}

	public function set bulletSpeed(value:Number):void {
		_bulletSpeed = value;
	}

	public function get towerName():String {
		return _towerName;
	}

	public function set towerName(value:String):void {
		_towerName = value;
	}
}

}